package pio.action.administrador.preinscripcion;

import DBMS.DataBaseManager;
import clases.*;
import java.util.ArrayList;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;

/**
 *
 * @author charles
 */
public class CalcularPreinscrito extends DispatchAction {

    private final static String SUCCESS = "success";
    private final static String FAILURE = "failure";

    public ActionForward populate(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        return mapping.findForward(SUCCESS);
    }

    public ActionForward make(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        //todo el codigo del algoritmo a implementar para realizar los calculos pertinentes al test.
        DataBaseManager dbms = DataBaseManager.getInstance();
        ArrayList<Vocacional> vocaCorrecto = dbms.consultarVocacional(new Vocacional());
        ArrayList<CriterioTest> criterioTest = dbms.consultarCriterioTest(new CriterioTest());
        CriterioTest ct = criterioTest.get(0);
        if (ct.getMinPorcentaje() != -1) {
            if (dbms.eliminarPreinscritos()) {
                calcularPreinscritoMinProm(vocaCorrecto, ct.getMinPorcentaje(), dbms, request);
            } else {
                System.out.println("Ocurrio un error");
            }
        } else {
            request.setAttribute("error", "El numero maximo tiene que estar puesto en -1");
            //quicksortMejorado(vocaCorrecto);
            // calcularPreinscritoGeneral(vocaCorrecto, ct.getMaxPreinscrito(), ct.getMinPorcentaje(), dbms, request);
        }
        System.out.println("llegue aki111");
        return mapping.findForward(SUCCESS);
    }

    //Calcula los preinscrito en base a un promedio minimo
    public void calcularPreinscritoMinProm(ArrayList<Vocacional> vocaCorrecto, int minPorcentaje,
            DataBaseManager dbms, HttpServletRequest request) {
        Preinscrito p = new Preinscrito();
        int porcentajeAcumulado = 0;
        String cedulas = "";
        String error = "Hubo un error agregando a los aspirante con las siguiente cedula:";
        Boolean siHayError = false;
        int numPreinscrito = 0;
        for (Vocacional v : vocaCorrecto) {
            cedulas += " " + v.getCedula() + " ";
            porcentajeAcumulado = 0;
            porcentajeAcumulado = calcularPorcentajeObtenido(v);
            if (porcentajeAcumulado >= minPorcentaje) {
                p.setCedula(v.getCedula());
                p.setNotaTest(porcentajeAcumulado);
                if (!dbms.agregarPreinscrito(p)) {
                    error += " " + p.getCedula() + ",";
                    siHayError = true;
                } else {
                    numPreinscrito += 1;
                }
            }
        }
        if (siHayError) {
            //request.setAttribute("error", error);
        }
        request.setAttribute("numPreinscritos", numPreinscrito);
        System.out.println(cedulas);
    }

    //dado un vocacional, calcula el porcentaje obtenido en base a las preguntas correctas
    private int calcularPorcentajeObtenido(Vocacional v) {
        int porcentajeAcumulado = 0;
        for (Pregunta preg : v.getPreguntas()) {
            for (Opcion op : preg.getOpciones()) {
                if (op.getCorrecta()) {
                    porcentajeAcumulado += preg.getPeso();
                    break;
                }
            }
        }
        System.out.println("El estudiante " + v.getCedula() + " obtuvo " + porcentajeAcumulado);
        return porcentajeAcumulado;
    }

    private void calcularPreinscritoGeneral(ArrayList<Vocacional> vocaCorrecto,
            int maxPreinscrito, int minPorcentaje, DataBaseManager dbms, HttpServletRequest request) {
        Preinscrito p = new Preinscrito();

        String error = "Hubo un error agregando a los aspirante con las siguiente cedula:";
        Boolean siHayError = false;
        int numPreinscrito = 0;
        int ultimaNota = 0;
        for (Vocacional v : vocaCorrecto) {
            if (numPreinscrito >= maxPreinscrito && v.getNotaAcumulada() != ultimaNota) {
                break;
            }
            if (minPorcentaje != -1 && v.getNotaAcumulada() < minPorcentaje) {
                break;
            }
            ultimaNota = v.getNotaAcumulada();
            p.setCedula(v.getCedula());
            p.setNotaPio(v.getNotaAcumulada());
            if (!dbms.agregarPreinscrito(p)) {
                error += " " + p.getCedula() + ",";
                siHayError = true;
            } else {
                numPreinscrito += 1;
            }
        }
    }

    private void quicksortMejorado(ArrayList<Vocacional> vocaCorrecto) {
        throw new UnsupportedOperationException("Not yet implemented");
    }
}
